package com.ylr.admin.framework.controller.web;

import java.util.List;
import java.util.Objects;

import com.ylr.base.common.annotation.Resubmit;
import com.ylr.base.common.dto.PageDto;
import com.ylr.admin.common.dto.uri.UriDto;
import com.ylr.admin.common.dto.uri.UriEnumDto;
import com.ylr.base.common.enums.CommonEnum;
import com.ylr.base.common.jsr303.group.Save;
import com.ylr.base.common.jsr303.group.Search;
import com.ylr.base.common.jsr303.group.Update;
import com.ylr.base.common.vo.UpdateStatusVo;
import com.ylr.admin.common.vo.uri.UriFormVo;
import com.ylr.admin.common.vo.uri.UriVo;
import com.ylr.admin.framework.service.UriService;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import com.ylr.base.common.tool.Result;

import javax.validation.constraints.Size;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-04-21 11:44:34
 * className: UriController
 * version: 1.0
 * description:
 */
@Validated
@RestController
@RequestMapping("/web/uri")
@AllArgsConstructor
public class UriWebController {

    private static final Logger log = LoggerFactory.getLogger(UriWebController.class);

    private final UriService uriService;

    /**
     * 保存‘系统接口’接口
     * <p>
     * 此接口会校验是否重复提交
     * @param uriVo 参数对象
     */
    @Resubmit(message = "保存系统接口")
    @PostMapping("/save")
    public Result<Object> saveUri(@Validated(Save.class) @RequestBody UriVo uriVo) {
        log.info("web => 开始保存‘系统接口’操作。{}", uriVo);
        String msg = uriVo.isEnumFail();
        if (StringUtils.isNotEmpty(msg)) {
            log.info("{}。checkMode={} label={}", msg, uriVo.getCheckMode(), uriVo.getLabel());
            return Result.requestFail(msg);
        }

        uriService.saveUri(uriVo);

        log.info("web => 保存‘系统接口’操作结束");
        return Result.success();
    }

    /**
     * 批量保存‘系统接口’接口
     * <p>
     * 此接口会校验是否重复提交
     * @param uriVoList 参数对象
     */
    @Resubmit(message = "批量保存系统接口")
    @PostMapping("/batch/save")
    public Result<Object> batchSaveUri(@Validated(Save.class) @Size(min = 1, message = "系统接口列表不能为空") @RequestBody List<UriVo> uriVoList) {
        log.info("web => 开始保存‘系统接口’操作。uriVoList={}", uriVoList);
        for (int i = 0; i < uriVoList.size(); i++) {
            UriVo uriVo = uriVoList.get(i);
            String msg = uriVo.isEnumFail();
            if (StringUtils.isNotEmpty(msg)) {
                log.info("第{}条数据，{}。checkMode={} label={}", i + 1, msg, uriVo.getCheckMode(), uriVo.getLabel());
                return Result.requestFail(msg);
            }
        }
        uriService.batchSaveUri(uriVoList);

        log.info("web => 保存‘系统接口’操作结束");
        return Result.success();
    }

    /**
     * 分页查询‘系统接口’接口
     * @param uriFormVo 参数对象
     * @return ‘系统接口’分页数据
     */
    @PostMapping("/page/list")
    public Result<PageDto<UriDto>> pageUriList(@Validated(Search.class) @RequestBody UriFormVo uriFormVo) {
        log.info("web => 开始分页查询‘系统接口’操作。{}", uriFormVo);

        if (ObjectUtils.allNull(uriFormVo.getParentId(), uriFormVo.getModule(), uriFormVo.getType(), uriFormVo.getType(), uriFormVo.getCheckMode(),
                uriFormVo.getLabel(), uriFormVo.getStatus()) && StringUtils.isAllBlank(uriFormVo.getWord(),
                uriFormVo.getUri())) {
            // 查询一级系统接口
            uriFormVo.setParentId(CommonEnum.DEFAULT_ID.getLongValue());
        }

        PageDto<UriDto> pageDto = uriService.pageUriList(uriFormVo);

        log.info("web => 分页查询‘系统接口’操作结束");
        return Result.success(pageDto);
    }

    /**
     * 获取‘系统接口’接口
     * @param id 主键
     * @return ‘系统接口’数据
     */
    @GetMapping("/get")
    public Result<UriDto> getUri(@RequestParam("id") Long id){
        log.info("web => 获取‘系统接口’操作。id={}", id);

        UriDto uriDto = uriService.getUri(id);

        log.info("web => 获取‘系统接口’操作");
        return Result.success(uriDto);
    }

    /**
     * 获取下一个排序等级接口
     * 根据父级主键，获取其子接口的下一个排序等级
     * @param parentId 父级主键
     * @return 排序等级数值
     */
    @GetMapping("/next/sort")
    public Result<Integer> getNextSort(@RequestParam("parentId") Long parentId) {
        log.info("web => 开始获取下一个排序等级操作。parentId={}", parentId);

        Integer sort = uriService.getNextSort(parentId);

        log.info("web => 获取下一个排序等级操作结束");
        return Result.success(sort);
    }

    /**
     * 获取接口包结构树接口
     * 如果传递父级主键，则获取其子包结构树
     * @param parentId 父级主键
     * @return 接口包结构树数据
     */
    @GetMapping("/packet/tree")
    public Result<List<UriDto>> getPacketTree(@RequestParam(value = "parentId", required = false) Long parentId) {
        log.info("web => 开始获取接口包结构树操作。parentId={}", parentId);

        List<UriDto> uriDtoList = uriService.getPacket(parentId);

        log.info("web => 获取接口包结构树操作结束");
        return Result.success(uriDtoList);
    }

    /**
     * 获取页面枚举数据接口
     * @return 页面枚举数据
     */
    @GetMapping("/page/enums")
    public Result<UriEnumDto> getPageEnums() {
        log.info("web => 开始获取页面枚举数据操作");

        UriEnumDto uriEnumDto = uriService.getPageEnums();

        log.info("web => 获取页面枚举数据操作结束");
        return Result.success(uriEnumDto);
    }

    /**
     * 修改‘系统接口’接口
     * <p>
     * 此接口会校验是否重复提交
     * @param uriVo 参数对象
     */
    @Resubmit(message = "修改系统接口")
    @PostMapping("/update")
    public Result<Object> updateUri(@Validated(Update.class) @RequestBody UriVo uriVo){
        log.info("web => 开始修改‘系统接口’操作。{}", uriVo);
        String msg = uriVo.isEnumFail();
        if (StringUtils.isNotEmpty(msg)) {
            log.info("{}。checkMode={} label={}", msg, uriVo.getCheckMode(), uriVo.getLabel());
            return Result.requestFail(msg);
        }

        uriService.updateUri(uriVo);

        log.info("web => 修改‘系统接口’操作结束");
        return Result.success();
    }

    /**
     * 修改‘系统接口’状态接口
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(message = "修改系统接口状态")
    @PostMapping("/update/status")
    public Result<Object> updateUriStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("web => 开始修改‘系统接口’状态操作。{}", updateStatusVo);

        CommonEnum statusEnum = CommonEnum.getStatusEnum(updateStatusVo.getStatus());
        if (Objects.isNull(statusEnum)) {
            log.info("‘系统接口’状态值枚举不存在");
            return Result.requestFail("状态值错误");
        }

        uriService.updateUriStatus(updateStatusVo);

        log.info("web => 修改‘系统接口’状态操作结束");
        return Result.success();
    }

    /**
     * 删除‘系统接口’接口
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     */
    @Resubmit(message = "删除系统接口")
    @DeleteMapping("/delete")
    public Result<Object> deleteUri(@Size(min = 1, message = "主键列表不能为空") @RequestBody List<Long> idList){
        log.info("web => 开始删除系统接口操作。idList={}", idList);

        uriService.deleteUri(idList);

        log.info("web => 删除系统接口操作结束");
        return Result.success();
    }

}
